diff --git a/module/apache/module.sh b/module/apache/module.sh
new file mode 100644
index 0000000..69161ac
--- /dev/null
+++ b/module/apache/module.sh
@@ -0,0 +1,485 @@
+#!/bin/bash
+#
+# module.sh - apache
+#
+# Copyright 2019 Luigi Santivetti <luigi.santivetti@gmail.com>
+
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+declare -r module="apache"
+source $common_sh
+
+module_enable $module
+declare -ar depmod=( mysql gerrit )
+
+declare -r etc_d="$mod_rootfs_d/etc"
+declare -r www_d="$mod_rootfs_d/var/www"
+declare -r log_d="$mod_rootfs_d/var/log/apache2"
+
+declare -r application_d="$www_d/application"
+declare -r html_d="$www_d/html"
+
+declare -r conf_d="$etc_d/apache2"
+declare -r available_d="$conf_d/sites-available"
+declare -r enabled_d="$conf_d/sites-enabled"
+declare -r views_d="$application_d/views"
+declare -r controllers_d="$application_d/controllers"
+
+# Docker context directory
+declare -r mod_authnz_external_mirror="mod-auth-external.git"
+declare -r mod_authnz_external_branch="mod_authnz_external-3.3.3"
+declare -r mod_authnz_external_d="${mod_docker_d}/mod_authnz_external"
+
+# Output files
+declare -r ports_f="$conf_d/ports.conf"
+declare -r apache2_f="$conf_d/apache2.conf"
+declare -r dockerfile_f="$mod_docker_d/Dockerfile"
+declare -r vhost_http_f="$available_d/vhost-http.conf"
+declare -r vhost_https_f="$available_d/vhost-https.conf"
+declare -r vhost_gerrit_f="$available_d/vhost-gerrit.conf"
+declare -r http_authentication_bang_f="${www_d}/http_authentication"
+
+# Staged resources
+declare -r backend_d="$mod_staging_d/code-igniter-v3-giggi.git"
+declare -r frontend_d="$mod_staging_d/pelican-subtle-giggi.git"
+declare -r content_d="$mod_staging_d/mdcon.git"
+declare -r pythonenv_d="$mod_staging_d/pelican-venv"
+
+declare -r pelican_version="4.0.1"
+declare -r markdown_version="3.1.1"
+declare -r setuptools_version="45"
+
+declare -ir apache_has_dummy_certs=1
+if [ $apache_has_dummy_certs -eq 1 ]; then
+	declare -r letsencrypt_d="$mod_staging_d/dummy_cert"
+else
+	declare -r letsencrypt_d="/etc/letsencrypt"
+fi
+declare -r certificates_l="$etc_d/certificates"
+
+declare -ar PELICAN_CLEAN_TARGETS=( pelican-all )
+declare -r apache_has_media=0
+if [ $apache_has_media -eq 1 ]; then
+	declare -r clean_skiptag_sh="clean_skiptag.sh"
+	declare -r skiptag="_.${host_name}."
+	declare -r media_d="$HOME/media"
+	declare -r photos_d="$media_d/photos"
+	declare -r videos_d="$media_d/videos"
+	declare -ar PELICAN_MAKE_TARGETS=( pelican-all )
+	declare -ar PELICAN_INSTALL_TARGETS=( pelican-all )
+else
+	declare -ar PELICAN_MAKE_TARGETS=( pelican-html )
+	declare -ar PELICAN_INSTALL_TARGETS=( pelican-html pelican-theme )
+fi
+declare -ar CODEIGN_INSTALL_TARGETS=( codeign-all )
+
+declare -ar mod_more_dirs=( \
+	$www_d $html_d $etc_d $conf_d $log_d $available_d $enabled_d \
+	$application_d $views_d $controllers_d $mod_authnz_external_d \
+)
+
+declare -ar mod_more_files=( \
+	$ports_f $apache2_f $vhost_http_f $vhost_https_f $vhost_gerrit_f \
+	$dockerfile_f $http_authentication_bang_f \
+)
+
+declare -ar mod_more_trefs=( \
+	ports_t apache2_t vhost_http_t vhost_https_t vhost_gerrit_t \
+	dockerfile_t http_authentication_bang_t \
+)
+
+function tod_watch
+{
+	__watch_module_common || return $s_err
+}
+
+function tod_doins
+{
+	__doins_module_common || return $s_err
+	__apache_do_sites     || return $s_err
+	__apache_do_links     || return $s_err
+}
+
+function tod_fetch
+{
+	__fetch_module_common || return $s_err
+}
+
+function tod_upins
+{
+	__upins_module_common || return $s_err
+}
+
+function tod_upmod
+{
+	__fetch_module_common   || return $s_err
+	__apache_do_ext_modules || return $s_err
+	__apache_do_dummy_cert  || return $s_err
+	__apache_do_backend     || return $s_err
+	__apache_do_frontend    || return $s_err
+}
+
+function tod_clmod
+{
+	__clmod_module_common || return $s_err
+}
+
+function tod_clins
+{
+	__clins_module_common || return $s_err
+}
+
+function tod_doall
+{
+	# upmod must come after
+	tod_doins && tod_upmod || return $s_err
+}
+
+function tod_upall
+{
+	# upmod must come after
+	tod_upins && tod_upmod || return $s_err
+}
+
+function __apache_do_ext_modules
+{
+	local origin_d="${mod_staging_d}/${mod_authnz_external_mirror}"
+	rm -rf ${mod_authnz_external_d}/* || return $s_err
+	cp -ar ${origin_d}/* ${mod_authnz_external_d}
+}
+
+function __apache_do_dummy_cert_helper
+{
+	local -r digital_sign="digitalSignature\nextendedKeyUsage=serverAuth"
+	local -r dn_dns="DNS:${host_name}\nkeyUsage=$digital_sign"
+	local -r dn_lhs="[dn]\nCN=${host_name}\n[req]\ndistinguished_name"
+	local -r dn_rhs="dn\n[EXT]\nsubjectAltName"
+
+	openssl req -x509 -out ${host_name}.crt -keyout ${host_name}.key \
+			-newkey rsa:2048 -nodes -sha256 \
+			-subj "/CN=${host_name}" -extensions EXT \
+			-config <(printf "$dn_lhs = $dn_rhs=$dn_dns") 2>&1 | lets -l -x "openssl"
+
+	return ${PIPESTATUS[0]}
+}
+
+function __apache_do_dummy_cert
+{
+	if [ $apache_has_dummy_certs -eq 1 ]; then
+		if [ ! -d $letsencrypt_d ]; then
+			mkdir -p $letsencrypt_d && \
+				pushd $letsencrypt_d >/dev/null || return $s_err
+			__apache_do_dummy_cert_helper && \
+				echo "# Dummy $host_name conf" > $host_name.conf && \
+				popd >/dev/null || {
+					lets -l -e "failed to make dummy certificates"
+					popd >/dev/null; return $s_err
+				}
+		fi
+	fi
+
+	lets -l -i "using $module SSL certificates from: $letsencrypt_d"
+	return $s_ok
+}
+
+function __apache_do_links
+{
+	__apache_do_dummy_cert || return $s_err
+
+	# NOTE: container path must match localhost path
+	#
+	# i.e.
+	#    localhost:/etc container:/etc                 OK
+	#    localhost:/home/luigi container:/home/???     NOT OK
+	#
+	ln -sf "${letsencrypt_d}" "${certificates_l}"
+}
+
+function __apache_do_sites
+{
+	if [ ! -d "$enabled_d" ]; then
+		lets -l -e "invalid: $enabled_d"
+		return 1
+	fi
+
+	# This list controls what site to enable
+	local -a sites=( $vhost_http_f $vhost_https_f $vhost_gerrit_f )
+
+	pushd $enabled_d &>/dev/null
+
+	local file
+	for file in ${sites[@]}; do
+		local link_name="$(basename "$file")"
+		file="../sites-available/$link_name"
+
+		if [ -f "$file" ]; then
+			ln -sf $file $link_name
+		else
+			lets -l -e "failed link $file"
+			popd &>/dev/null
+			return 1
+		fi
+	done
+
+	popd &>/dev/null
+}
+
+# @1      : absolute path to the target directory
+# @2      : (optional) requirements txt file
+function __apache_do_venv
+{
+	local -ar deps=( python3-dev python3-pip python3-venv python3-wheel )
+
+	if [ -z "$1" ] || [ ! -f "$2" ]; then
+		lets -l -e "virtual environment: invalid params"
+		return $s_err
+	fi
+
+	if [ ! -e "$1/bin/activate" ]; then
+		local install="python3 -m pip install --no-cache-dir --upgrade"
+		local -a global_packages=( "virtualenv" "pip" )
+		local -a local_packages=(
+			"wheel"
+			"setuptools==$setuptools_version"
+			"pelican==$pelican_version"
+			"markdown==$markdown_version"
+		)
+
+		util_install_dependency ${deps[@]} || {
+			lets -l -e "install python dependencies"
+			return $s_err
+		}
+
+		mkdir -p "$1" || {
+			lets -l -e "virtual envirnment: mkdir failed"
+			return $s_err
+		}
+
+		$install --user ${global_packages[@]} 2>&1 | lets -l -x "pip3"
+
+		python3 -m venv "$1" 2>&1 | lets -l -x "python"
+		[ "${PIPESTATUS[0]}" -eq 0 ] || {
+			lets -l -e "virtual environment: create failed"
+			return $s_err
+		}
+
+		source "$1/bin/activate" || return $s_err
+		(
+			$install ${local_packages[@]} 2>&1 | lets -l -x "pip3"
+			[ "${PIPESTATUS[0]}" -eq 0 ] || {
+				deactivate
+				return $s_err2
+			}
+
+			while read -r pkg; do
+				$install $pkg 2>&1 | lets -l -x "pip3"
+				[ "${PIPESTATUS[0]}" -eq 0 ] || {
+					deactivate
+					return $s_err3
+				}
+			done < "$2"
+
+			deactivate
+		)
+		case "$?" in
+			$s_err2) lets -l -e "install local packages"; return $s_err ;;
+			$s_err3) lets -l -e "install $(basename $2)"; return $s_err ;;
+		esac
+	else
+		lets -l -w "virtual environment: exists already"
+	fi
+
+	return $s_ok
+}
+
+function __apache_frontend_clean
+{
+	local target
+
+	for target in ${PELICAN_CLEAN_TARGETS[@]}; do
+		case "$target" in
+			pelican-html      ) make clean-html   || return $s_err ;;
+			pelican-theme     ) make clean-theme  || return $s_err ;;
+			pelican-photos    ) make clean-photos || return $s_err ;;
+			pelican-videos    ) make clean-videos || return $s_err ;;
+			pelican-distclean ) make distclean    || return $s_err ;;
+			pelican-all       ) make clean        || return $s_err ;;
+		esac
+	done
+}
+
+function __apache_frontend_make
+{
+	local target
+
+	for target in ${PELICAN_MAKE_TARGETS[@]}; do
+		case "$target" in
+			pelican-html)
+				PELICAN_PHOTO_LIBRARY=$photos_d \
+				PELICAN_PHOTO_EXCLUDEALL="1" \
+				PELICAN_VIDEO_LIBRARY=$videos_d \
+				PELICAN_VIDEO_EXCLUDEALL="1" \
+				PELICAN_SITEURL=$host_name \
+				PELICAN_CONTENT=$content_d \
+				make html || return $s_err ;;
+			pelican-all)
+				PELICAN_PHOTO_LIBRARY=$photos_d \
+				PELICAN_PHOTO_EXCLUDE=${EXCLUDED_PHOTOS[@]} \
+				PELICAN_PHOTO_SKIPTAG=$skiptag \
+				PELICAN_VIDEO_LIBRARY=$videos_d \
+				PELICAN_VIDEO_EXCLUDE=${EXCLUDED_VIDEOS[@]} \
+				PELICAN_SITEURL=$host_name \
+				PELICAN_VIDEO_SKIPTAG=$skiptag \
+				PELICAN_CONTENT=$content_d \
+				PELICAN="pelican" \
+				make html || return $s_err ;;
+		esac
+	done
+}
+
+
+# FIXME: improve integration with skiptag
+function __finalise_install
+{
+	[ ! -f "$1/$clean_skiptag_sh" ] || {
+		pushd "$1" &>/dev/null && \
+			source "$1/$clean_skiptag_sh" && popd &>/dev/null
+	}
+}
+
+function __apache_frontend_install
+{
+	local target
+
+	[ -d "$views_d" ] && [ -d "$html_d" ] || {
+		lets -l -w "not installing frontend"
+		return $s_ok
+	}
+
+	for target in ${PELICAN_INSTALL_TARGETS[@]}; do
+		case "$target" in
+			pelican-html)
+				INSTALLDIR=$views_d \
+				make install-html   || return $s_err ;;
+			pelican-theme)
+				INSTALLDIR_THEME=$html_d \
+				make install-theme  || return $s_err ;;
+			pelican-photos)
+				INSTALLDIR_PHOTOS=$photos_d \
+				make install-photos || return $s_err ;;
+			pelican-videos)
+				INSTALLDIR_VIDEOS=$videos_d \
+				make install-videos || return $s_err ;;
+			pelican-all)
+				INSTALLDIR=$views_d \
+				INSTALLDIR_THEME=$html_d \
+				INSTALLDIR_PHOTOS=$photos_d \
+				INSTALLDIR_VIDEOS=$videos_d \
+				make install || return $s_err
+
+				# FIXME: improve integration with skiptag
+				__finalise_install $photos_d || \
+					lets -l -e "Failed to finalise photos"
+				__finalise_install $videos_d || \
+					lets -l -e "Failed to finalise videos" ;;
+		esac
+	done
+}
+
+function __create_apache_frontend
+{
+	if [ $apache_has_media -eq 1 ]; then
+		[ -d "$photos_d" ] || mkdir -p "$photos_d" || return $s_err
+		[ -d "$videos_d" ] || mkdir -p "$videos_d" || return $s_err
+	fi
+
+	set -e; source $1/bin/activate; set +e || return $s_err3
+
+	__apache_frontend_clean   || { deactivate; return $s_err4; }
+	__apache_frontend_make    || { deactivate; return $s_err5; }
+	__apache_frontend_install || { deactivate; return $s_err6; }
+	__apache_frontend_clean   || { deactivate; return $s_err4; }
+
+	deactivate; true
+}
+
+function __apache_do_frontend
+{
+	local req="requirements.txt"
+	local file="$(realpath "$(find "$frontend_d" -name $req)")"
+
+	# Is this running in a container? If so this script assumes all global
+	# system wise dependencies to be provided at build time, only care about
+	# local packages taht can vary on the runtime.
+	if [ -z "$instance_d" ]; then
+		lets -l -i "virutal environment: container"
+		local venv_d=$pythonenv_con_d
+	else
+		local venv_d=$pythonenv_d
+	fi
+
+	__apache_do_venv $venv_d $file || return $s_err
+	lets -l -d "virtual environment: complete"
+
+	pushd $frontend_d &>/dev/null
+	__create_apache_frontend $pythonenv_d 2>&1 | lets -l -x "make"
+	case "${PIPESTATUS[0]}" in
+		$s_ok   ) popd &>/dev/null; return $s_ok          ;;
+		$s_err3 ) lets -l -e "failed to activate python"  ;;
+		$s_err4 ) lets -l -e "failed to clean frontend"   ;;
+		$s_err5 ) lets -l -e "failed to make frontend"    ;;
+		$s_err6 ) lets -l -e "failed to install frontend" ;;
+		*       ) lets -l -e "failed unknown error"       ;;
+	esac; popd &>/dev/null; return $s_err
+}
+
+function __apache_backend_install
+{
+	local target
+
+	[ -d "$backend_d/application" ] && \
+		[ -d "$backend_d/system" ] && [ -f "$backend_d/index.php" ] || {
+		lets -l -w "not installing backend"
+		return $s_ok
+	}
+
+	for target in ${CODEIGN_INSTALL_TARGETS[@]}; do
+		case "$target" in
+			codeign-all)
+				cp -ra $backend_d/application $www_d || return $s_err2
+				cp -ra $backend_d/system $www_d      || return $s_err3
+				cp -a $backend_d/index.php $html_d   || return $s_err4 ;;
+		esac
+	done
+}
+
+function __create_apache_backend
+{
+	__apache_backend_install
+}
+
+function __apache_do_backend
+{
+	__create_apache_backend 2>&1 | lets -l -x "copy"
+	case "$?" in
+		$s_err2 ) lets -l -e "failed to install application code" ;;
+		$s_err3 ) lets -l -e "failed to install system code"      ;;
+		$s_err4 ) lets -l -e "failed to install index.html"       ;;
+	esac
+}
